iT邦幫忙

2024 iThome 鐵人賽

DAY 24
0
Security

picoCTF 刷題分享系列 第 24

picoCTF 刷題分享---Day24(刷題去)

  • 分享至 

  • xImage
  •  

今天這題是以前我跳過的題目,因為真的太難了!!,我今天在圖書館裡解開來的那一刻,我是真的開心到封掉還起來跳舞🤣🤣,終於有進步了😭😭(有種得冠軍的感覺?


題目:FactCheck

  • 這題用$ file bin看到是ELF,我就加上權限並執行,但並沒有任何反應
  • 於是我使用ida做靜態分析
  • 打開後按F5進入返編譯會直接看到flag的前部分
    https://ithelp.ithome.com.tw/upload/images/20241008/20164155vVIRFCoO82.png
    順便解釋這些是什麼意思
    • 1.初始化一個分配器,名為v21
    • 2.賦值給v22一個字串(也就是flag的前半段),等價於std::stringv22("picoCTF{wELF_d0N3_mate_}");
    • 3.release v21的內存
  • 再來就是很多個下面的圖片
    https://ithelp.ithome.com.tw/upload/images/20241008/20164155TmOmHVhSzh.png
    一樣我解釋一下
    • 第一行是在創建一個 std::string 物件,它使用了 std::allocator 來管理內存
      • v23:是已初始化的一個變數,儲存的是新的 std::string 對象的引用。(="9")
      • "9":這是用來初始化 std::string 的值 "9"。
      • &v21:這個參數是 std::allocator<char> 的實例。它負責為新創建的 std::string 提供內存
      • 簡單來說他會在v21裡面提供內存給"9"這個值,再把這個值的地址給v23,所以會變成v23="9"
    • 第二行是在釋放v21的內存為了再次使用
    • 第三行是在紀錄"9"的地址並存入v4
      再來會一直重複以上行為把v23~38分別存入相對應的值
      https://ithelp.ithome.com.tw/upload/images/20241008/20164155zbCeHVJeZ8.png
      再來要到if的部分了,剛剛在做的事只是在存變數而已,有關後半部的flag到現在開始才會增加
      https://ithelp.ithome.com.tw/upload/images/20241008/201641551GfNW4JLRd.png
      注意這裡(怕太小看不到🤣
      https://ithelp.ithome.com.tw/upload/images/20241008/20164155SLhKSUbevQ.png
  • 當v24 <= 65的時候進行operator+=(v22, v34); // v22+=v34;
  • v24 = "5" = 53(ascii code) <= 65,所以執行
  • v22 = v22("picoCTF{wELF_d0N3_mate_") + v34("9") = "picoCTF{wELF_d0N3_mate_9"
    下一步:
    https://ithelp.ithome.com.tw/upload/images/20241008/20164155Fo3IFMMyAU.png
  • 當v35 != 65時,進行operator+=(v22, v37);
  • v35 = "6" = 54 != 65,所以執行
  • v22 = v22("picoCTF{wELF_d0N3_mate_9") + v37("3") = "picoCTF{wELF_d0N3_mate_93"
    下一步:
    https://ithelp.ithome.com.tw/upload/images/20241008/20164155yEtiWLLv2d.png
  • 很明顯是false所以直接跳過
    下一步:
    https://ithelp.ithome.com.tw/upload/images/20241008/201641550N19GJMaAp.png
  • 這個需要分開看一下
    • 第一步:
      • 取出v26的第0位("3”)
    • 第二步:
      • *(char *) 在這裡並不是改變字元的類型,而是對 char 型別進行了取值(解引用)
    • 在 C++ 中,char 型別可以看作是整數類型(也就是所謂的ascii碼)

所以總結一下:所以這裡v19的值會是"3"的ascii ( 51 )
下一步:
https://ithelp.ithome.com.tw/upload/images/20241008/20164155h1h9w5RFZz.png

  • 當v19-v30==3時,執行
  • v19(51) - (v30("e")==101) != 3,所以不執行
    下一步:
    https://ithelp.ithome.com.tw/upload/images/20241008/20164155zlwiGcAqPF.png
  • 第一行:operator+=(v22, v25); //"picoCTF{wELF_d0N3_mate_93"+"a"
  • 第二行:operator+=(v22, v28); // "picoCTF{wELF_d0N3_mate_93a"+"9"
  • 目前的flag:"picoCTF{wELF_d0N3_mate_93a9"
    下一步:
    https://ithelp.ithome.com.tw/upload/images/20241008/20164155mubmm4b3Lp.png
  • bin(v29) = bin("a") = bin(65) != bin(71),所以不執行
    下一步:
    https://ithelp.ithome.com.tw/upload/images/20241008/20164155YGW4JkWzud.png
    前面三行都一樣的概念,查表後填上去即可會得到"picoCTF{wELF_d0N3_mate_93a9cb95"
    最後一個是125L這個也可以去查ascii表,它代表的是'}'
    所以就可以得到完整的flag了!!!!
    格式:picoCTF{flag.content}

後記:終於寫完今天的份了,接下來要去寫成大的新生盃了🫠🫠,寫到10點,就要開始刷金盾獎的題目,真5LuW5aq955qE刺激阿(自己解)掰啦~~~~


上一篇
picoCTF 刷題分享---Day 23(刷題去)
下一篇
picoCTF 刷題分享---Day 25(刷題去)
系列文
picoCTF 刷題分享30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言